package org.smile.util;

import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
  
/**
 * 日期工具类 
 * 具日期转换等方法
 * @author strive
 *
 */
public class DateUtils{  
	
	/**
	 * 此工具适用的转换格式 
	 */
    private static final DateFormat[] ACCEPT_DATE_FORMATS = {  
    	 	new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),
    	 	new SimpleDateFormat("yyyy-MM-dd"),
    	 	new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"),
    	 	new SimpleDateFormat("MM/dd/yyyy"),
    }; // 支持转换的日期格式
  
    /**
     * 得到一个DateFormat 对象 以一个字符串格式
     * @param format
     * @return
     */
    public  static DateFormat getFormat(String format){
    	if("yyyy-MM-dd HH:mm:ss".equals(format)){
    		return ACCEPT_DATE_FORMATS[0];
    	}else if("yyyy-MM-dd".equals(format)){
    		return ACCEPT_DATE_FORMATS[1];
    	}else if("MM/dd/yyyy HH:mm:ss".equals(format)){
    		return ACCEPT_DATE_FORMATS[2];
    	}else if("MM/dd/yyyy".equals(format)){
    		return ACCEPT_DATE_FORMATS[3];
    	}else{
    		return new SimpleDateFormat(format);
    	}
    	
    }
    /**
     * 日期与字符串之间的转换方法
     * 是字符串就转成日期
     * 是日期就转成字符串 
     * @param value 一个要转换的值  可以是日期格式的字符串 或 日期
     * @return
     */
    public static Object convert(Object value){   
        if (value instanceof String) {  
        	// 浏览器向服务器提交时，进行String to Date的转换
            String dateString = (String)value;   
            // 获取日期的字符串
            for (DateFormat format : ACCEPT_DATE_FORMATS) {   
                try {   
                    return format.parse(dateString);
                    // 遍历日期支持格式，进行转换
                } catch(Exception e) {   
                    continue;   
                }   
            }   
            return null;   
        }   
        else if (value instanceof Date) {
        	// 服务器向浏览器输出时，进行Date to String的类型转换
            Date date = (Date)value;   
            for (DateFormat format : ACCEPT_DATE_FORMATS) {  
            	try{
            		return format.format(date);
            	}catch (Exception e) {
            		continue;
				}
            }
        }  
        return null;
    }
    /**
     * 日期转换 
     * @param value 要转换的值 可以是日期类型 和 字符串 类型
     * @param format 格式
     * @return 
     * @throws Exception
     */
    public static Object convert(Object value,String format) throws Exception
    {
    	try{
    	if (value instanceof String) {  
        	// 浏览器向服务器提交时，进行String to Date的转换
            String dateString = (String)value;   
            // 获取日期的字符串
            return  getFormat(format).parse(dateString);   
        }   
        else if (value instanceof Date) {
        	// 服务器向浏览器输出时，进行Date to String的类型转换
            Date date = (Date)value;   
            return getFormat(format).format(date);
            
        }  
    	}catch (Exception e) {
			throw new Exception("日期转换出错，请检查格式是否正确"+e);
		}
        return null;
    }
    /**
     * 格式化一个日期
     * @param date
     * @param text
     * @return
     * @throws Exception
     */
    public static String formatDate(Date date,String text) throws Exception{
    	return (String)convert(date,text);
    }
    /**
     * 当前日期的一个相隔的日期
     * @param day 相隔的天数 如：-1 当前日期前一天 的日期 ，5当前日期的5天后的日期
     * @return  
     */
    public static Date getDateBetweenNow(int day)
    {
    	Calendar c=Calendar.getInstance();
    	c.set(Calendar.HOUR_OF_DAY, 0);
    	c.set(Calendar.MINUTE,0);
    	c.set(Calendar.SECOND, 0);
    	c.add(Calendar.DATE, day);
    	return c.getTime();
    }
    /**
     * 把一个日期转换成一个适用于做为结束日期查询的日期
     * 其实就是把一个日期转换成'yyyy-MM-dd 23:59:59" 这种日期
     * @param d
     * @return
     */
    public static Date formatToBeginDate(Date d)
    {
    	try{
	    	Calendar c=Calendar.getInstance();
	    	c.setTime(d);
	    	c.set(Calendar.HOUR_OF_DAY,0);
	    	c.set(Calendar.MINUTE,0);
	    	c.set(Calendar.SECOND,0);
	    	return c.getTime();
    	}catch (Exception e) {
			return null;
		}
    	
    }
    /**
     * 把一个日期转换成一个适用于做为起始日期查询的日期
     * 其实就是把一个日期转换成'yyyy-MM-dd 00:00:00" 这种日期
     * @param d
     * @return
     */
    public static Date formatToEndDate(Date d)
    {
    	try {
			String str=(String)convert(d,"yyyy-MM-dd");
			return (Date)convert(str+" 23:59:59","yyyy-MM-dd HH:mm:ss");
		} catch (Exception e) {
			return null;
		}
    }
    /**
	 * 处理oracle时间类型
	 * @param value
	 * @return
	 */
	@SuppressWarnings({ "unused", "unchecked" })
	public static Timestamp getOracleTimestamp(Object value) { 
		try { 
			Class clz = value.getClass(); 
			Method m = clz.getMethod("timestampValue", new Class[]{}); 
			return (Timestamp) m.invoke(value, new Object[]{}); 
		} catch (Exception e) { 
			return null;
		} 
	}
}
